use std::io::{self, Write};
use std::net::UdpSocket;
use std::str;

fn main() -> std::io::Result<()> {
    println!("UDP 客户端启动");
    
    // 创建客户端套接字并绑定到随机端口
    let socket = UdpSocket::bind("127.0.0.1:0")?;
    println!("客户端已绑定到本地端口: {}", socket.local_addr()?);
    
    // 设置服务器地址
    let server_addr = "127.0.0.1:5051";
    println!("连接到服务器: {}", server_addr);
    println!("输入 '/quit' 退出程序");
    println!("----------------------");
    
    loop {
        // 读取用户输入
        print!("请输入消息:");
        io::stdout().flush().unwrap(); // 确保提示信息立即显示
        let mut input = String::new();
        io::stdin().read_line(&mut input)?;
        let input = input.trim();
        
        if input.is_empty() {
            continue;
        }
        
        if input == "/quit" {
            println!("退出程序");
            break;
        }
        
        // 发送数据到服务器
        socket.send_to(input.as_bytes(), server_addr)?;
        println!("已发送: {}", input);
        
        // 接收服务器响应
        let mut buf = [0; 512];
        match socket.recv_from(&mut buf) {
            Ok((size, src)) => {
                let response = match str::from_utf8(&buf[..size]) {
                    Ok(s) => s,
                    Err(e) => {
                        eprintln!("无效的UTF-8序列: {}", e);
                        continue;
                    }
                };
                println!("从服务器 {} 接收: {}", src, response);
            }
            Err(e) => {
                eprintln!("接收响应失败: {}", e);
            }
        }
    }
    
    Ok(())
}